home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE3a.s < prev    next >
Text File  |  1994-10-30  |  7KB  |  162 lines

  1.  
  2. ; Lezione3a.s    - COME SI ESEGUE UNA ROUTINE DEL SISTEMA OPERATIVO
  3.  
  4. Inizio:
  5.     move.l    $4.w,a6        ; Execbase in a6
  6.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  7. mouse:
  8.     move.w    $dff006,$dff180    ; metti VHPOSR in COLOR00 (lampeggio!!)
  9.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  10.     bne.s    mouse        ; se no, torna a mouse:
  11.  
  12.     move.l    4.w,a6        ; Execbase in a6
  13.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  14.     rts
  15.  
  16.     END
  17.  
  18. Questo e' il primo listato in cui usiamo una routine del sistema operativo!
  19. E guarda caso proprio quella che disabilita il sistema operativo stesso!
  20. Infatti noterete che durante l'esecuzione la freccia controllata dal mouse si
  21. blocca, premendo il tasto destro non appaiono i menu a tendina, i disk drive
  22. smettono di fare click. E state attenti che anche il comando AD, ossia il
  23. debugger, che usa il sistema operativo, viene disabilitato, rimanendo bloccato!
  24. ricordatevi quindi che quando disabilitiamo il sistema operativo, o addirittura
  25. puntiamo una nostra copperlist, il debugger serve fino a che il sistema
  26. operativo e' vivo!
  27. Provate comunque a fare "AD", premendo il tasto cursore con la freccia verso
  28. destra (con questo tasto infatti si "penetra" dentro i BSR e JSR, mentre col
  29. tasto cursore con la freccia verso il basso si salta il debug di BSR e JSR).
  30. Passata la prima istruzione, il MOVE.L 4.w,a6, comparira' nel registro A6
  31. l'indirizzo che era contenuta nela long composta dai 4 bytes $4,$5,$6,$7.
  32. Premete ESC e veririficate facendo un "M 4", premendo 4 volte return: troverete
  33. infatti lo stesso indirizzo. Questo indirizzo e' messo in quel punto dal kick
  34. ogni volta che si resetta o si accende l'amiga.
  35. Riprendete il debug, passate il MOVE.L 4.w,a6, ed "entrate" nel JSR -$78(a6)
  36. con i cursore: per seguire la subroutine dovete osservare la linea disassembly
  37. in fondo allo schermo, infatti noterete una istruzione JMP $fcxxxx o $f8xxxx,
  38. a seconda se avete un kick 1.3 o 2.0/3.0. Siete all'indirizzo che era in $4
  39. meno $78, e vi trovate nella memoria RAM del vostro Amiga ancora, dove pero'
  40. trovate un JMP che vi fara' saltare nella ROM. Infatti, ogni volta che
  41. l'Amiga perde quel secondo o due durante il RESET, o l'accensione, crea in
  42. memoria una TABELLA DI JMP, il cui indirizzo finale e' messo in $4.
  43. Ogni JMP salta all'indirizzo di quel particolare kickstart dove si trova la
  44. routine corrispondente alla posizione di quel JMP rispetto alla sua fine.
  45. Infatti facendo JSR -$78(a6) si disabilita il multitasking sia su un kick 1.2
  46. che su un kick 1.3, o 2.0 o 3.0, cosi' pure per quelli futuri.
  47. Se per esempio nel kick 1.3 la routine nel ROM si trovasse a $fc12345, il
  48. JMP posto a $78 bytes sotto l'indirizzo base sara' JMP $fc12345, mentre
  49. se su un kick 2.0 la routine in questione fosse a $f812345, il JMP in questione
  50. sara' a $f812345. Questo sistema permette anche di caricare un kickstart in
  51. RAM: bastera' poi che faccia una TABELLA DI JMP che puntino alle sue routines.
  52. Fermate il debug con ESC dopo esservi annotati a che indirizzo era il JMP,
  53. e provate a fare un "D quell'indirizzo" (l'indirizzo dell'istruzione e' il
  54. primo numero a sinistra in fondo allo schermo! oppure lo trovate anche in
  55. fondo alla lista dei registri sulla destra, e' il registro PC, ossia Program
  56. Counter, che registra l'indirizzo in esecuzione, basta che gli aggiungiate un
  57. $ davanti). Verificherete che c'e una fila di JMP; questo e' un esempio:
  58.  
  59.     JMP    $00F817EA    ; -$78(a6), ossia il DISABLE
  60.     JMP    $00F833DC    ; -$72(a6) un'altra routine
  61.     JMP    $00F83064    ; -$6c(a6) un'altra routine...
  62.     JMP    $00F80F74    ; ....
  63.     JMP    $00F80F0C
  64.     JMP    $00F81B74
  65.     JMP    $00F81AEC
  66.     JMP    $00F8103A
  67.     JMP    $00F80F3C
  68.     JMP    $00F81444
  69.     JMP    $00F813A0
  70.     JMP    $00F814F8
  71.     JMP    $00F82842
  72.     JMP    $00F812F8
  73.     JMP    $00F812D6
  74.     JMP    $00F80B38
  75.     JMP    $00F82C24
  76.     JMP    $00F82C24
  77.     JMP    $00F82C20
  78.     JMP    $00F82C18
  79.  
  80. Per inserire pezzi di disassemblato nel sorgente ho usato il comando "ID",
  81. in cui bisogna dire l'inizio e la fine della zona da inserire:
  82.  
  83. BEG> qua mettete l'indirizzo o la label, provate con l'indirizzo del JMP
  84. END> mettete l'indirizzo finale, oppure $xxxxx+$80, intendendo per $xxxxx
  85.      l'indirizzo di partenza: in questo caso si otterra' il disassemblato
  86.      a partire dall'indirizzo $xxxxx fino a $80 bytes dopo.
  87.  
  88. REMOVE UNUSED LABELS? (Y/N)    ; QUA METTETE UN "Y". Se non lo mettete sara'
  89.                 ; messa una label recante l'indirizzo ad
  90.                 ; ogni linea di codice, anziche' solo dove
  91.                 ; serve la label. Provate a fare un "ID"
  92.                 ; di questo listato per verificare la
  93.                 ; differenza.
  94.  
  95. Esempio: se l'indirizzo era $32123
  96.  
  97. ID
  98.  
  99. BEG> $32123
  100. END> $32123+$80        ; NOTA: per riavere i vecchi indirizzi premete
  101.             ; il tasto cursore verso l'alto varie volte.
  102.             ; (Infatti premendo la freccia verso l'alto ritornano
  103.             ; le cose che avete scritto prima come nello SHELL)
  104.  
  105. e apparira', a partire dal punto dove eravate col cursore l'ultima volta nel
  106. testo, il disassemblato richiesto.
  107.  
  108. Ora vi potete immaginare quanti JSR e JMP deve eseguire il processore quando
  109. un programma gli chiede di eseguire delle routine. E tutto questo saltare fa
  110. perdere tempo, e' per questo che useremo il sistema operativo solo il minimo
  111. indispensabile.
  112.  
  113. Se continuate con il DEBUG dopo il JMP, vi ritroverete nella ROM, cioe'
  114. all'indirizzo del JMP: di solito il DISABLE e' cosi':
  115.  
  116.     MOVE.W    #$4000,$dff09a    ; INTENA - Ferma gli interrupt
  117.     ADDQ.B    #1,$126(a6)    ; Ferma il sistema operativo
  118.     RTS
  119.  
  120. Se ci entrate premendo la freccia verso destra le istruzioni saranno viste,
  121. ma non eseguite (per sicurezza il debug quando esegue delle subroutine fuori
  122. dal listato, ossia di solito nella ROM, le scorre e basta), infatti potete
  123. continuare e andare nel loop del mouse e noterete che la freccia del mouse
  124. si puo' muovere e i drive fanno il click, cioe' non sono state eseguite
  125. quelle 2 operazioni. Potrete passare anche dal JSR -$7e(a6) e uscire.
  126.  
  127. Provate invece a scendere usando il tasto cursore con la freccia verso il
  128. basso: questa volta passando dal JSR -$78(a6) il programma vi scappera' di
  129. mano, perche' viene eseguita (senza pero' essere mostrata).
  130. Potrete comunque uscire con il tasto sinistro, dopodiche' dovrete premere
  131. da ESC per uscire dal DEBUG.
  132.  
  133. Provate ora a fare queste modifiche:
  134.  
  135. 1) Assemblate, fate un "D inizio" e vedrete questo:
  136.  
  137.     MOVE.L    $0004.W,A6
  138.  
  139. Provate ora a togliere il .w al 4 nel listato, assemblate e ripetete il "D":
  140.  
  141.     MOVE.L    $00000004,A6
  142.  
  143. Come vedete, in questo caso sono stati usati tutti i 4 byte dell'indirizzo,
  144. mentre prima con l'opzione .w abbiamo risparmiato 2 bytes. L'opzione .w
  145. puo' essere usata su tutti gli indirizzi linghi una sola word o meno.
  146.  
  147. 2) Provate a sostituire la linea
  148.  
  149.     JSR    -$78(a6)
  150.  
  151. con le linee
  152.  
  153.     MOVE.W    #$4000,$dff09a    ; INTENA - Ferma gli interrupt
  154.     ADDQ.B    #1,$126(a6)    ; Ferma il sistema operativo
  155.  
  156. O comunque quello che trovate nella ROM dopo il JMP (senza l'RTS finale!).
  157.  
  158. Noterete che il funzionamento e' lo stesso.
  159.  
  160. Potete fare la stessa cosa con il JSR -$7e(a6).
  161.  
  162.